package com.ego.dubbo.service.impl;

import com.ego.commons.exception.DaoException;
import com.ego.commons.pojo.EasyUITree;
import com.ego.dubbo.service.TBContentCategoryDubboService;
import com.ego.mapper.TbContentCategoryMapper;
import com.ego.mapper.TbContentMapper;
import com.ego.pojo.TbContent;
import com.ego.pojo.TbContentCategory;
import com.ego.pojo.TbContentCategoryExample;
import com.ego.pojo.TbContentExample;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@DubboService
public class TbContentCategoryDubboServiceImpl implements TBContentCategoryDubboService {



    @Autowired
    private TbContentCategoryMapper tbContentCategoryMapper;

    @Autowired
    private TbContentMapper tbContentMapper;

    @Override
    public List<EasyUITree> selectContentCategoryByParentId(long parentId) {

        TbContentCategoryExample tbContentCategoryExample = new TbContentCategoryExample();
        tbContentCategoryExample.createCriteria().andParentIdEqualTo(parentId);
        List<TbContentCategory> tbContentCategories = tbContentCategoryMapper.selectByExample(tbContentCategoryExample);

        //需要将商品分类数据转换成EasyUITree需要的数据
        List<EasyUITree> easyUITrees = new ArrayList<>();
        for (TbContentCategory category : tbContentCategories) {
            //创建EasyUITree对象
            EasyUITree easyUITree = new EasyUITree();
            easyUITree.setId(category.getId());
            easyUITree.setText(category.getName());
            easyUITree.setState(category.getIsParent()?"closed":"open");
            easyUITrees.add(easyUITree);
        }

        return easyUITrees;
    }

    /**
     * 新增的几个步骤
     * 1，检查名称是否重复
     *
     * 2，新增内容分类
     * 3，将当前分类的父目录修改成 true
     *
     *
     * @param tbContentCategory
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public int insert(TbContentCategory tbContentCategory) throws DaoException {

        int index = 0;
        //根据当前信息的类别名称查询数据库中是否有存在数据，存在，抛出异常：分类名称不能相同
        TbContentCategoryExample tbContentCategoryExample = new TbContentCategoryExample();
        tbContentCategoryExample.createCriteria().andNameEqualTo(tbContentCategory.getName());

        List<TbContentCategory> tbContentCategories = tbContentCategoryMapper.selectByExample(tbContentCategoryExample);

        if(tbContentCategories.size() == 0){

            //新增内容分类
            index = tbContentCategoryMapper.insert(tbContentCategory);

            if(index == 1){
                //将当前分类的父目录修改成 true
                TbContentCategory tbContentCategoryParent = new TbContentCategory();
                tbContentCategoryParent.setId(tbContentCategory.getParentId());
                tbContentCategoryParent.setIsParent(true);
                //设置修改时间
                tbContentCategoryParent.setUpdated(tbContentCategory.getCreated());

                index = tbContentCategoryMapper.updateByPrimaryKeySelective(tbContentCategoryParent);

            }
        }else{
            throw new DaoException("类别名称重复，请换一个名称");
        }

        return index;
    }

    /**
     * 修改步骤
     * 1，检查修改名称是否重复，重复就抛异常
     *
     * 2，修改
     */
    @Override
    public int update(TbContentCategory tbContentCategory) throws DaoException {

        //根据当前信息的类别名称查询数据库中是否有存在数据，存在，抛出异常：分类名称不能相同
        TbContentCategoryExample tbContentCategoryExample = new TbContentCategoryExample();
        tbContentCategoryExample.createCriteria().andNameEqualTo(tbContentCategory.getName());

        List<TbContentCategory> tbContentCategories = tbContentCategoryMapper.selectByExample(tbContentCategoryExample);

        if(tbContentCategories.size() == 0){

           return tbContentCategoryMapper.updateByPrimaryKeySelective(tbContentCategory);

        }else{
            throw new DaoException("类别名称重复，请换一个名称");
        }
    }

    /**
     * 删除步骤
     * 1，先从内容表中检查当前要删除的分类是否有关联分类id，有不能删除
     * 2，删除分类
     */
    @Override
    public int deleteById(long categoryId) throws DaoException {

        // 1，先从内容表中检查当前要删除的分类是否有关联分类id，有不能删除
        TbContentExample tbContentExample = new TbContentExample();
        tbContentExample.createCriteria().andCategoryIdEqualTo(categoryId);

        List<TbContent> tbContents = tbContentMapper.selectByExample(tbContentExample);

        if(tbContents.size()==0){
            return tbContentCategoryMapper.deleteByPrimaryKey(categoryId);
        }else{
            throw new DaoException("改分类下面还有内容关联，不能删除！");
        }
    }
}
